<?php

/*******************************************************************************
 * 
 * CLASSE [ collection ]
 *
 *******************************************************************************
 * 
 * Classe permettant de manipuler des vues sur des collections d'objets
 *******************************************************************************
 * 
 * @package objects
 * @version 20070808
 * @author Stanislas PERRIN <stanislas.perrin@gmail.com>
 * 
 * 
 * Attention !
 * Cette classe a besoin de la classe debug.class.php qui se trouve ici :
 * http://svn.extramuros.com/libs/debug.class.php
 * 
 */

CLASS collection EXTENDS db
{
	#########################################################################
	#
	# PROPRIETES
	#
	#########################################################################

	//private $object = NULL;
	private $dbConnectionObject = NULL;
	private $table = NULL;
	private $collectionType = false;
	private $collection = array();
	private $propertyCollection = array();

	#########################################################################
	#
	# CONSTRUCTEUR
	#
	#########################################################################
	
	public function __construct($dbConnectionObject=false,$object=false)
	{
		if (!$dbConnectionObject || !$object) throw new debug('impossible de creer une collection : arguments incorrects',-100);
		$this->dbConnectionObject = $dbConnectionObject;
		$this->table = $object->getTable();
		parent::__construct($dbConnectionObject);
		$this->collectionType = get_class($object);		
	}
	
	#########################################################################
	#
	# METHODES PUBLIQUES
	#
	#########################################################################
	
	public function open()
	{

	}
	
	/*
	* create()
	*
	* cree une collection selon une condition de requete
	*
	* @param string $condition chaine representant la condition SQL de la requete
	*/
	public function create($condition)
	{
		$this->query("SELECT {$this->table}.id FROM {$this->table} WHERE $condition");
		if(!$this->queryResultRC) throw new debug("la requete n'a pas retourné de résultat valide",-100);
		while($line = mysql_fetch_assoc($this->queryResultRC))
		{
			$id = $line['id'] * 1;
			$this->add($id);
		}
		return true;
	}
	
	/*
	 * propertyCollection()
	 */
	 public function propertyCollection()
	 {
 		if (count($this->collection) < 1) throw new debug('collection vide !',-100);
	 	foreach($this->collection as $object)
	 	{
	 		array_push($this->propertyCollection, $object->getAllProperties());
	 	}
	 	
	 	return $this->propertyCollection;
	 }
	
	/**
	 * 
	 * add()
	 * 
	 * ajoute un objet a la collection et le charge de ses proprietes a partir de son id
	 *
	 * @param int id identifiant de l'objet a ouvrir
	 *
	 * @return void
	 */
	public function add($id)
	{
		array_push($this->collection,new $this->collectionType($this->dbConnectionObject,$this->table));
		$last = end($this->collection);
		$last->open($id);
	}
	
	/*
	* delete()
	*/
	public function delete()
	{
	}
	
	
	/*
	* collection()
	* 
	* retourne la collection (tableau contenant les objets de la collection)
	*/
	public function collection()
	{
		return $this->collection;
	}
	
	/*
	* callback()
	*
	* appelle une methode appartenant aux objets de la collection sur tous les objets de cette collection
	*
	* @param string $functionName nom de la fonction a appeller sur tous les objets de la collectionType
	* @param array(mixed) $functionArguments tableau contenant les arguments a passer a $functionName
	*/
	public function callback($functionName,$functionArguments=array())
	{
		// declarations
		$strArguments = '';
		
		// construction de la chaine contenant la liste d'arguments de la fonction
		if (!empty($functionArguments))
		{
			$strArguments = implode(',',$functionArguments);
		}
		
		// appel de la fonction sur toute la collection
		foreach ($this->collection as $o)
		{
			$o->{$functionName}($strArguments);
		}
	}
	
	/*
	* createArray()
	*
	* cree un tableau multidimensionnel de proprietes des objets de la collection
	*
	* @param array properties tableau contenant les proprietes dans l'ordre ou elle vont
	* apparaitre dans le tableau de sortie
	*
	* @return array
	*/
	public function createArray($properties)
	{
		$a = array();
		$tmp = array();
		
		foreach($this->collection as $objet)
		{
			foreach($properties as $property)
			{
				array_push($tmp,$objet->get($property));
			}
			
			array_push($a,$tmp);
		}
		
		return $a;
	}
	
	/*
	* close()
	*
	* @param
	* 
	* @return void
	*/
	public function close()
	{
		unset($this);
	}
	
	#########################################################################
	#
	# METHODE PRIVEES
	#
	#########################################################################
	
}
